﻿using System;

namespace 哥德巴赫猜想
{
    class Program
    {
		//static int[] prime = new int[200];
		static int count = 0;
		static void Eratosthenes(int n, int [] prime)
        {
            int[] arr = new int[n + 1];
			for (int i = 0; i < n; i++)
			{//对数组赋值  1-100
				arr[i] = i + 1;
			}
			arr[0] = 0;//1不是素数，将下标0 的元素设置为0			
			for (int i = 1; i < n - 1; i++)
			{//进行素数判断:从2开始, 用2除后面的数，如果后面的数能被2整除, 那么那个数一定不是素数,将那个数置为零
				for (int j = i + 1; j < n; j++)
				{
					if (arr[i] != 0 && arr[j] != 0)// 进行到3的时候2后面一定有数被置为0，判断一下是否有0
						if (arr[j] % arr[i] == 0)
						{
							arr[j] = 0;
						}
				}
			}			
			for (int i = 0; i < n; i++)
			{// 将代求数以内的素数存入数组
				if (arr[i] != 0)
                {
					prime[count++] = arr[i];
				}
			}
		}

        static void Main(string[] args)
		{
			int n,con = 0;
			Console.WriteLine("请输入求解范围(<=200)");
			n = int.Parse(Console.ReadLine());
			var prime = new int[n];
			Eratosthenes(n, prime);
			for(int i = 4; i <= n; i += 2)
            {
				bool flag = true;
				for(int j = 0;j < count - 1 && flag; ++j)
                {
					for(int k = j;k < count; ++k)
                    {
						if (i < prime[j] + prime[k]) break;
						if(i == prime[j] + prime[k])
                        {
							++con;
							if (con % 4 == 0) Console.WriteLine(string.Format("{0, 4} = {1, 2} + {2, -3}", i, prime[j], prime[k]));
							else Console.Write(string.Format("{0, 4} = {1,2} + {2,-3} ", i, prime[j], prime[k]));
							flag = false;
						}
                    }
                }
            }

		}
    }
}
